class Centro < ActiveRecord::Base
  has_many :empleados, :conditions => {:status_id => 1}
  has_many :facturas, :conditions => {:status_id => 1}
  has_many :concursos, :conditions => {:status_id => 1}
  has_many :promociones, :conditions => {:status_id => 1}
  has_many :presencias, :conditions => {:status_id => 1}
  has_many :presupuestos, :order => 'marca_id, rubro_id'
  has_many :bonificacion_detalles
  has_many :puntaje_centro_consumos
  has_many :salida_materiales, :conditions => {:status_id => 1}
  
  belongs_to :ejecutivo
  belongs_to :corporativo

  validates_presence_of :nombre_comercial, :razon_social, :rfc, :calle, :num_exterior, :codigo_postal, :ciudad, :colonia
  validates_presence_of :tipo_cuenta_id, :giro_id, :rango_precio_id
  validates_presence_of :region_id
  
  validates_uniqueness_of :nombre_comercial
  
  validates_format_of :rfc, :with => /[A-Z]{3,4}[0-9]{6}(([A-Z]|[0-9]){3})/
  
  validates_length_of :nombre_comercial, :razon_social, :calle, :maximum => 40
  validates_length_of :rfc, :in => 12..13
  validates_length_of :codigo_postal, :is => 5
  validates_length_of :num_exterior, :num_interior, :maximum => 5
  
  validates_numericality_of :codigo_postal
  
  def one_of_two_numbers?
    contact_number_valid?('telefono') || contact_number_valid?('fax')
  end

  def contact_number_valid?(contact_number)
    !(instance_eval("#{contact_number}_lada").blank?) &&
      !(instance_eval("#{contact_number}_numero").blank?)
  end
  
  def domicilio
    "#{calle} #{num_exterior}/#{num_interior}, COL. #{colonia}, C.P. #{codigo_postal}, #{ciudad}"
    
  end

  def puntos_acumulados
    favor = puntaje_centro_consumos.sum('puntos', :conditions => {:operacion => PuntajeCentroConsumo::ABONO}).to_i
    contra = puntaje_centro_consumos.sum('puntos', :conditions => {:operacion => PuntajeCentroConsumo::CARGO}).to_i
    logger.debug "Puntos a favor: #{favor}"
    logger.debug "Puntos en contra: #{contra}"
    
    favor - contra
  end

  def bonificaciones(operacion)
    BonificacionDetalle.sum('importe', :conditions => {:centro_id => self, :operacion => operacion}).to_f
  end

  def saldo_bonificacion(destino)
    conditions = {}
    conditions[:destino_id] = destino
    conditions[:operacion] = BonificacionDetalle::ABONO
    conditions[:centro_id] = self
    
    total_abonos = BonificacionDetalle.sum('importe', :conditions => conditions).to_f
    
    conditions[:operacion] = BonificacionDetalle::CARGO
    
    total_cargos = BonificacionDetalle.sum('importe', :conditions => conditions).to_f
    
    total_abonos - total_cargos
  end

  protected
  
  def validate
    errors.add(:telefono_lada) if !one_of_two_numbers?
    errors.add(:telefono_numero) if !one_of_two_numbers?
    errors.add(:fax_lada) if !one_of_two_numbers?
    errors.add(:fax_numero) if !one_of_two_numbers?
  end
  
end
